#include "IndiceArbol.h"
#include "../estrategiaAlmacenamiento/Iterador.h"

IndiceArbol::IndiceArbol(TipoClave* extractor,std::string url, cantBytes tamanioMaxClave,int orden) :
	Indice(extractor), arbol(url,extractor,orden,tamanioMaxClave ) {
	this->url = url;
	vacio = !arbol.inicializar();

}

bool IndiceArbol::existeClave(Key clave) {
	Resultado res = RES_INEXISTENTE;
	Elemento* e = arbol.buscar(clave, res);
	if (res == RES_OK){
		delete e;
		return true;
	}
	return false;
}


bool IndiceArbol::getNumComponente(Key clave, offset& numComponente) {
	Resultado res = RES_INEXISTENTE;
	Elemento* e = arbol.buscar(clave, res);
	if (res == RES_OK) {
		numComponente = e->getDato();
		if(e != NULL){
			delete e;
		}
		return true;
	}
	return false;
}

bool IndiceArbol::agregar(Key clave, offset numComponente) {
	Elemento e(clave, numComponente);
	return (arbol.insertar(e) == RES_OK);
}

bool IndiceArbol::quitar(Key clave, offset& numComponente) {
	Elemento e(clave, numComponente);
	return arbol.borrar(e);
}

bool IndiceArbol::indexar(RecursoDeAlmacenamiento* recurso) {
	std::string url = recurso->getPath();
	url += "_";
	url += extractor->toString() + ".bsi";

	Iterador* it = recurso->getIterador();
	it->reiniciarIterador();
	while (it->tieneSiguiente()) {
		offset o = it->getOffset();
		Bytes b = it->getSiguiente();
		this->agregar(extractor->crearClave(extractor->extraerClave(b)), o);
	}
	delete it;
	vacio = arbol.estaVacio();
	return !vacio;
}

IndiceArbol::~IndiceArbol() {
}

void IndiceArbol::visualizar() {
	std::cout<<"***********************************************************************************\n"<<
			 "*                              Indice Arbol B#                                    *\n"<<
			 "* Se imprimen por pantalla las Hojas seguidas por su padre, luego se imprimen     *\n"<<
			 "* las hojas que son 'primas' (nuestros padres son hermanos) y nuestro tio, para   *\n"<<
			 "* todos nuestros tios. Luego se imprime el abuelo delas hojas y se pasa a realizar*\n"<<
			 "* lo mismo para todos los hermanos de ese abuelo, hasta llegar a la raiz.         *\n"<<
			 "*                                                                                 *\n"<<
			 "***********************************************************************************\n"<<
			 "*                                                                                 *\n"<<
			 "*                          Estructura / Referencias                               *\n"<<
			 "*                                                                                 *\n"<<
			 "* Hojas:    H (ID,ID PADRE,ID SIGUIENTE) clave1[offset1],...,claveN[offsetN]      *\n"<<
			 "* Internos: I (ID,ID PADRE) clave1,clave2,...,claveN                              *\n"<<
			 "*                                                                                 *\n"<<
			 "***********************************************************************************\n"<<std::endl;
			 arbol.visualizar();
}
